 /** 
 * @addtogroup nmea
 * nmea
 * @brief NMEA分词器辅助工具 
 * @{
 */
 
/**
 * @file nmea_token.h
 * @brief NMEA分词器辅助工具 
 * @details 负责NMEA报文分词处理
 * 
 * @author lzl(lzl@hopechart.com)
 * @date 2019-9-19
 * @version 1.1
 * @copyright 杭州鸿泉物联网技术股份有限公司
 * 
 * @par 修订日志
 * <table>
 * <tr><th>Date <th>Version <th> Author <th> Descripton
 * <tr><td>2019-9-19 <td>1.1 <td> liuzl <td> 建立初始版本
 * </table>
 * 
 */
#ifndef _HUBS_LIB_NMEA_TOKEN_H_
#define _HUBS_LIB_NMEA_TOKEN_H_

#include <stdbool.h>
#include "nmea/nmea_types.h"

#define NMEA_TOKENS_MAX         (21)

typedef struct TNmeaTokenTag TNmeaToken;

/**
 * Token结构
 */
struct TNmeaTokenTag {
    const char *p;                                  ///< 开始位置
    const char *end;                                ///< 结束位置
};

#ifdef __cplusplus
extern "C" {
#endif

static inline bool NmeaTokenIsEmpty(const TNmeaToken *tk) 
{ 
    return tk == NULL || tk->p == NULL || tk->end == NULL || (tk->p + 1) > tk->end; 
}

static inline int NmeaTokenLen(const TNmeaToken *tk) 
{ 
    return NmeaTokenIsEmpty(tk) ? 0 : (tk->end - tk->p); 
}

/**
 * 转换NMEA日期型Token 
 *
 * @note 1、传入的Token必须是完整的yymmdd,否则失败返回true 
 * 2、不判断范围有效性 
 * 
 * @param tk 字段对象指针
 * @param year 年(00-99),不能为空
 * @param month 月(1~12),不能为空
 * @param mday 日(1-31),不能为空
 * 
 * @return bool 
 * @retval true 成功 
 * @retval false 失败 
 */
bool NmeaTokenToDate(const TNmeaToken *tk, int *year, int *month, int *mday);

/**
 * 转换NMEA时间型Token
 * 
 * @param tk 字段对象指针
 * @param hours 小时,不能为空
 * @param minutes 分钟,不能为空
 * @param seconds 秒,不能为空
 * @param time_ms 毫秒，不能为空
 * 
 * @return bool 
 * @retval true 成功 
 * @retval false 失败 
 */
bool NmeaTokenToTime(const TNmeaToken *tk, int *hours, int *minutes, int *seconds, int *time_ms);

/**
 * 整型Token转整型
 * 
 * @param tk 字段对象指针 
 * @param value 接收结构(不可为空)
 * 
 * @return bool 
 * @retval true 成功 
 * @retval false 失败 
 */
bool NmeaTokenToInt(const TNmeaToken *tk, int *value);

/**
 * 转换NMEA浮点数
 * 
 * @param tk 字段对象指针 
 * @param fraction 分数保留位数(即整体放大10次幂)
 * @param value 输出值指针,不能为空
 * 
 * @return bool 
 * @retval true 成功 
 * @retval false 失败 
 */
bool NmeaTokenFloatToInt(const TNmeaToken *tk, int fraction, int *value);

/**
 * 转换NMEA经纬度 
 *  
 * 将DDDMM[.mmm]形式的经纬度转换到放大(e7)倍以度为单位的经纬度
 * 
 * @param tk 字段对象指针
 * @param value 结果(单位:1/10000000度)
 * 
 * @return bool 
 * @retval true 成功 
 * @retval false 失败 
 */
bool NmeaTokenToLongLatitude(const TNmeaToken *tk, int *value);

#ifdef __cplusplus
}
#endif
    
#endif//_HUBS_LIB_NMEA_TOKEN_H_

/**
 * @} 
 */























